package com.dylan.历史.多线程.并发编程的艺术;

import com.dylan.历史.util.LogUtil;
import com.dylan.历史.util.SleepUtils;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * Created by Dylan on 2018/9/19.
 *
 * 测试循环屏障
 */
public class CyclicBarrierTest {

    /**
     * 每3个线程为一组同时执行
     * CyclicBarrier 内部使用 ReentrantLock 的"等待/通知"机制实现的
     */
    public static void main(String[] args) {
        CyclicBarrier barrier = new CyclicBarrier(3, () -> LogUtil.info("---开始运行---"));
        for (int i = 0; i < 9; i++) {
            new Thread(() -> {
                LogUtil.info("我被启动了");
                try {
                    barrier.await();
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
                LogUtil.info("我执行了");
            }).start();
            SleepUtils.seconds(1);
        }
    }
}
